﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Crosland.Automotriz.Core;
using System.Data.SqlClient;
using System.Globalization;

namespace Crosland.Automotriz.Data.Dao.Linq
{
    public class clsTh_Procesoabc_CabDAO
    {
        AutomotrizEntities ContextoDeObjs = new AutomotrizEntities();


        public IEnumerable<Object> listar_th_procesoabc_cab()
        {

            IEnumerable<Object> lista = new List<Object>();
            var q = from tl in ContextoDeObjs.T_LOG_INVENTARIO_ABC_CAB.AsEnumerable()
                        where tl.IND_ANULADO == false
                        orderby tl.ANIO descending, tl.MES descending
                        select new
                        {
                            tl.ID_INVENTARIO_ABC_CAB,
                            tl.ANIO,
                            NUM_MES=tl.MES,
                            MES =tl.MES==1?"Enero":tl.MES==2?"Febrero":tl.MES==3?"Marzo":tl.MES==4?"Abril":tl.MES==5?"Mayo":tl.MES==6?"Junio":tl.MES==7?"Julio":tl.MES==8?"Agosto":tl.MES==9?"Septiembre":tl.MES==10?"Octubre":tl.MES==11?"Noviembre":tl.MES==12?"Diciembre":"",
                            tl.FECHA_PROCESO,
                            tl.USUARIO_CREACION,
                            TIPO_N=tl.Nro_Meses_Tipo_N.ToString() + " meses",
                            TIPO_O=tl.Nro_Meses_Tipo_O.ToString() + " meses",
                            ESTADO = tl.IND_ANULADO == false ? "No":
                                     tl.IND_ANULADO==true ? "Si":"",
                            tl.PERI_VENTA_INI,
                            tl.PERI_VENTA_FIN
                        };

                lista = q.ToList();
            return lista;
        }



        private string obtenerNombreMesNumero(int numeroMes)
        {
            try
            {
                DateTimeFormatInfo formatoFecha = CultureInfo.CurrentCulture.DateTimeFormat;
                string nombreMes = formatoFecha.GetMonthName(numeroMes);
                return nombreMes;
            }
            catch
            {
                return "Desconocido";
            }
        }




        public bool procesar_ABC(int ID_ORG_VTA, string PERI_VENTA_INI, string PERI_VENTA_FIN, string VI_ABC_DESDE_HASTA_VEN, string VI_ABC_DESDE_HASTA_CAN,string COD_USUARIO, int ANIO, int MES, int MESES_N, int MESES_O)
        {
                ContextoDeObjs.CommandTimeout = 600;
                ContextoDeObjs.ExecuteStoreCommand("EXEC USP_PROCESAR_ABC @VI_ID_ORG_VTA={0},@VI_PERI_VENTA_INI={1},@VI_PERI_VENTA_FIN={2},@VI_ABC_DESDE_HASTA_VEN={3},@VI_ABC_DESDE_HASTA_CAN={4},@VI_COD_USUARIO={5},@ANIO_Proceso={6},@MES_proceso={7},@VI_NroMeses_N={8},@VI_NroMeses_O={9}", ID_ORG_VTA, PERI_VENTA_INI, PERI_VENTA_FIN, VI_ABC_DESDE_HASTA_VEN, VI_ABC_DESDE_HASTA_CAN,COD_USUARIO, ANIO, MES, MESES_N, MESES_O);
                return true;         
               
        }

        //revertir el proceso abc anterior


        public bool update_tipo_Abc(int nro_proceso)
        {

            try
            {
                ContextoDeObjs.CommandTimeout = 600;
                ContextoDeObjs.ExecuteStoreCommand("update TD_MATERIAL 	SET TIPO_ABC = abc.SITUACION_ANT from TD_MATERIAL las inner join TH_PROCESOABC_DET abc ON abc.COD_MATERIAL = las.COD_MATERIAL	WHERE ABC.NUM_PROC=" + nro_proceso);

                return true;
            }
            catch (SqlException ex)
            {

                Globales.msjSql = ex.Message;

                return false;
            }
            catch (Exception ex)
            {

                Globales.msjAplicacion = ex.Message;

                return false;
            }

        }




        public bool deleteTh_proceso_abc_cab(int nro_proceso)
        {


            try
            {


                ContextoDeObjs.ExecuteStoreCommand("UPDATE TH_PROCESOABC_CAB SET ESTADO=1 WHERE NUM_PROC=" + nro_proceso);
                return true;

            }

            catch (SqlException ex)
            {

                Globales.msjSql = ex.Message;
                return false;
            }

            catch
            {
                return false;

            }


        }





        public int UltimoAnio_th_procesarAbc_cab()
        {
            int max = 0;

            try
            {
                max = ContextoDeObjs.TH_PROCESOABC_CAB.Select(x => (Int32)x.ANIO).Max();


            }
            catch (Exception)
            {
                return max;
            }

            return max;

        }

        public int UltimoMes_th_procesarAbc_cab(int anio)
        {
            int max = 0;

            try
            {
                max = ContextoDeObjs.TH_PROCESOABC_CAB.Where(a => a.ANIO == anio && a.ESTADO == 0).Max(x => (Int32)x.MES);

            }
            catch (Exception)
            {
                return max;
            }

            return max;

        }
        public int? ValidaProcesoxmes(int anio, int mes)
        {
                var q=from p in ContextoDeObjs.T_LOG_INVENTARIO_ABC_CAB
                      where p.ANIO==anio && p.MES==mes && p.IND_ANULADO==false
                        select p;
                return q.Count();    

        }



        public List<Globales.ListaProcesoABCEtiqueta> lista_etiquetas()
        {

            List<Globales.ListaProcesoABCEtiqueta> list = new List<Globales.ListaProcesoABCEtiqueta>();
            try
            {

                var q = from c in ContextoDeObjs.T_MAE_TABLA_GENERAL_CAB
                        from d in ContextoDeObjs.T_MAE_TABLA_GENERAL_DET
                        where c.ID_GENERAL_CAB == d.ID_GENERAL_CAB && c.NOM_TABLA == "T_VEN_PROCESO_ABC_PARAMETROS"
                        select d;

                Globales.ListaProcesoABCEtiqueta Item = new Globales.ListaProcesoABCEtiqueta();
                foreach (var s in q)
                {

                    switch (s.DES_CORTA)
                    {
                        case "A_I": Item.A_I = s.IMP_VALOR.ToString();
                            break;
                        case "A_F": Item.A_F = s.IMP_VALOR.ToString();
                            break;
                        case "B_I": Item.B_I = s.IMP_VALOR.ToString();
                            break;
                        case "B_F": Item.B_F = s.IMP_VALOR.ToString();
                            break;
                        case "C_I": Item.C_I = s.IMP_VALOR.ToString();
                            break;
                        case "C_F": Item.C_F = s.IMP_VALOR.ToString();
                            break;
                        case "N": Item.N = s.IMP_VALOR.ToString();
                            break;
                        case "O": Item.O = s.IMP_VALOR.ToString();
                            break;
                    }

                    list.Add(Item);

                }



            }
            catch (Exception ex)
            {
                throw ex;
            }
            return list;

        }



        public IEnumerable<Object> listar_th_procesoabc_cab_detalle(int idCab)
        {

            IEnumerable<Object> lista = new List<Object>();
            try
            {
                var q = from tl in ContextoDeObjs.T_LOG_INVENTARIO_ABC_RANGO.AsEnumerable()
                        join td in ContextoDeObjs.T_MAE_TABLA_GENERAL_DET.AsEnumerable()
                        on tl.ID_TIPO_PROCESO equals td.ID_GENERAL_DET
                        where tl.ID_INVENTARIO_ABC_CAB==idCab
                        select new
                        {
                            tl.ID_INVENTARIO_ABC_CAB,
                            td.DES_CORTA,
                            tl.V_ABC,
                            RANGO = Convert.ToInt32(tl.V_INI).ToString() + "-" + Convert.ToInt32(tl.V_FIN).ToString()
                        };

                lista = q.ToList();

            }
            catch
            {
                throw;
            }

            return lista;
        }







    }
}
